#!/usr/bin/env bash
set -eo pipefail
[[ $DOKKU_TRACE ]] && set -x

fn-plugin-property-get() {
  declare desc="returns the value for a given property"
  declare PLUGIN="$1" APP="$2" KEY="$3" DEFAULT="$4"

  fn-plugin-property-get-default "$PLUGIN" "$APP" "$KEY" "$DEFAULT"
}

fn-plugin-property-clone() {
  declare desc="clone the properties for an app"
  declare PLUGIN="$1" OLD_APP="$2" NEW_APP="$3"
  "$PLUGIN_CORE_AVAILABLE_PATH/common/prop" "clone" "$PLUGIN" "$OLD_APP" "$NEW_APP"
}

fn-plugin-property-destroy() {
  declare desc="destroy the properties for an app"
  declare PLUGIN="$1" APP="$2"
  "$PLUGIN_CORE_AVAILABLE_PATH/common/prop" "destroy" "$PLUGIN" "$APP"
}

fn-plugin-property-delete() {
  declare desc="delete a key from the property store for an app"
  declare PLUGIN="$1" APP="$2" KEY="$3"
  "$PLUGIN_CORE_AVAILABLE_PATH/common/prop" "del" "$PLUGIN" "$APP" "$KEY"
}

fn-plugin-property-exists() {
  declare desc="returns whether the property store has a value for an app"
  declare PLUGIN="$1" APP="$2" KEY="$3"
  "$PLUGIN_CORE_AVAILABLE_PATH/common/prop" "exists" "$PLUGIN" "$APP" "$KEY"
}

fn-plugin-property-get-all() {
  declare desc="returns a map of all properties for a given app"
  declare PLUGIN="$1" APP="$2"
  "$PLUGIN_CORE_AVAILABLE_PATH/common/prop" "get-all" "$PLUGIN" "$APP"
}

fn-plugin-property-get-default() {
  declare desc="returns the value for a given property with a specified default value"
  declare PLUGIN="$1" APP="$2" KEY="$3" DEFAULT="$4"
  "$PLUGIN_CORE_AVAILABLE_PATH/common/prop" "get-with-default" "$PLUGIN" "$APP" "$KEY" "$DEFAULT"
}

fn-plugin-property-list-add() {
  declare desc="adds a property to a list at an optionally specified index"
  declare PLUGIN="$1" APP="$2" KEY="$3" VALUE="$4" INDEX="$5"
  "$PLUGIN_CORE_AVAILABLE_PATH/common/prop" "rpush" "$PLUGIN" "$APP" "$KEY" "$VALUE" "$INDEX"
}

fn-plugin-property-list-get() {
  declare desc="returns a property list"
  declare PLUGIN="$1" APP="$2" KEY="$3"
  "$PLUGIN_CORE_AVAILABLE_PATH/common/prop" "lrange" "$PLUGIN" "$APP" "$KEY"
}

fn-plugin-property-list-get-by-index() {
  declare desc="returns an entry within property list by index"
  declare PLUGIN="$1" APP="$2" KEY="$3" INDEX="$4"
  "$PLUGIN_CORE_AVAILABLE_PATH/common/prop" "lindex" "$PLUGIN" "$APP" "$KEY" "$INDEX"
}

fn-plugin-property-list-get-by-value() {
  declare desc="returns an entry within property list by value"
  declare PLUGIN="$1" APP="$2" KEY="$3" VALUE="$4"
  "$PLUGIN_CORE_AVAILABLE_PATH/common/prop" "lismember" "$PLUGIN" "$APP" "$KEY" "$VALUE"
}

fn-plugin-property-list-length() {
  declare desc="returns the length of a property list"
  declare PLUGIN="$1" APP="$2" KEY="$3"
  "$PLUGIN_CORE_AVAILABLE_PATH/common/prop" "llen" "$PLUGIN" "$APP" "$KEY"
}

fn-plugin-property-list-remove() {
  declare desc="removes a value from a property list"
  declare PLUGIN="$1" APP="$2" KEY="$3" VALUE="$4"
  "$PLUGIN_CORE_AVAILABLE_PATH/common/prop" "lrem" "$PLUGIN" "$APP" "$KEY" "$VALUE"
}

fn-plugin-property-list-remove-by-prefix() {
  declare desc="removes a value by prefix from a property list"
  declare PLUGIN="$1" APP="$2" KEY="$3" PREFIX="$4"
  "$PLUGIN_CORE_AVAILABLE_PATH/common/prop" "lrem-by-prefix" "$PLUGIN" "$APP" "$KEY" "$PREFIX"
}

fn-plugin-property-list-set() {
  declare desc="sets a value within a property list at a specified index"
  declare PLUGIN="$1" APP="$2" KEY="$3" VALUE="$4" INDEX="$5"
  "$PLUGIN_CORE_AVAILABLE_PATH/common/prop" "lset" "$PLUGIN" "$APP" "$KEY" "$VALUE" "$INDEX"
}

fn-plugin-property-write() {
  declare desc="read a key from the property store for an app"
  declare PLUGIN="$1" APP="$2" KEY="$3" VALUE="$4"
  "$PLUGIN_CORE_AVAILABLE_PATH/common/prop" "set" "$PLUGIN" "$APP" "$KEY" "$VALUE"
}

fn-plugin-property-setup() {
  declare desc="creates the plugin config root"
  declare PLUGIN="$1"
  "$PLUGIN_CORE_AVAILABLE_PATH/common/prop" "setup" "$PLUGIN"
}

fn-plugin-property-setup-app() {
  declare desc="setup the properties for an app"
  declare PLUGIN="$1" APP="$2"
  "$PLUGIN_CORE_AVAILABLE_PATH/common/prop" "setup-app" "$PLUGIN" "$APP"
}
